package com.example.mapper;

import com.example.dto.ConsumptionRecordQueryDTO;
import com.example.entity.ConsumptionRecord;
import com.example.vo.ConsumptionRecordVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * 消费记录Mapper接口
 */
@Mapper
public interface ConsumptionRecordMapper {
    
    /**
     * 插入消费记录
     */
    int insert(ConsumptionRecord consumptionRecord);
    
    /**
     * 根据ID更新消费记录
     */
    int updateById(ConsumptionRecord consumptionRecord);
    
    /**
     * 根据ID删除消费记录（逻辑删除）
     */
    int deleteById(Long id);
    
    /**
     * 根据ID查询消费记录
     */
    ConsumptionRecord selectById(Long id);
    
    /**
     * 根据订单号查询消费记录
     */
    ConsumptionRecord selectByOrderNo(@Param("orderNo") String orderNo);
    
    /**
     * 根据预约ID查询消费记录
     */
    ConsumptionRecord selectByAppointmentId(@Param("appointmentId") Long appointmentId);
    
    /**
     * 根据用户ID查询消费记录列表
     */
    List<ConsumptionRecord> selectByUserId(@Param("userId") Long userId);
    
    /**
     * 根据店长ID查询消费记录列表
     */
    List<ConsumptionRecord> selectByStoreManagerId(@Param("storeManagerId") Long storeManagerId);
    
    /**
     * 条件查询消费记录VO列表（分页）
     */
    List<ConsumptionRecordVO> selectVOList(@Param("query") ConsumptionRecordQueryDTO query);
    
    /**
     * 统计消费记录总数
     */
    long selectCount(@Param("query") ConsumptionRecordQueryDTO query);
    
    /**
     * 根据用户ID统计消费总金额
     */
    BigDecimal selectTotalConsumeByUserId(@Param("userId") Long userId);
    
    /**
     * 根据店长ID统计收入总金额
     */
    BigDecimal selectTotalIncomeByStoreManagerId(@Param("storeManagerId") Long storeManagerId);
    
    /**
     * 统计今日消费总金额
     */
    BigDecimal selectTodayTotalConsume();
    
    /**
     * 统计今日消费总笔数
     */
    long selectTodayTotalCount();
    
    /**
     * 根据时间范围统计消费金额
     */
    BigDecimal selectTotalConsumeByDateRange(@Param("startTime") String startTime, 
                                           @Param("endTime") String endTime);
    
    /**
     * 根据时间范围统计消费笔数
     */
    long selectTotalCountByDateRange(@Param("startTime") String startTime, 
                                   @Param("endTime") String endTime);
    
    /**
     * 根据店长ID和时间范围统计收入金额
     */
    BigDecimal selectTotalIncomeByStoreManagerIdAndDateRange(@Param("storeManagerId") Long storeManagerId,
                                                           @Param("startTime") String startTime, 
                                                           @Param("endTime") String endTime);
} 